package top.zywork.weixin;

import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpStatus;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import top.zywork.common.HttpUtils;
import top.zywork.common.IOUtils;
import top.zywork.enums.ContentTypeEnum;
import top.zywork.enums.MIMETypeEnum;

/**
 * 微信小程序码工具类<br/>
 *
 * 创建于2019-08-16<br/>
 *
 * @author 王振宇
 * @version 1.0
 */
@Slf4j
public class WeixinQrcodeUtils {

    /**
     * 生成小程序码
     * @param accessToken access_token
     * @param page 小程序页面地址，如pages/index/index
     * @param scene 查询字符串，限制32个可见字符，如a=1&b=2或直接由参数和分割符组成的字符串
     * @param width 二级码宽度，默认值430px
     * @param autoColor 是否自动颜色，默认为false，只有在false的情况下，rgb设置的颜色值才可用
     * @param rColor rgb中的r值，如20
     * @param gColor rgb中的g值，如30
     * @param bColor rgb中的b值，如40
     * @param isHyaline 是否透明，默认为false
     * @return 返回图片字节数组数据
     */
    public static byte[] getUnlimitedQrcode(String accessToken, String page, String scene, Integer width, Boolean autoColor, Integer rColor, Integer gColor, Integer bColor, Boolean isHyaline) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("page", page);
        if (StringUtils.isNotEmpty(scene)) {
            jsonObject.put("scene", scene);
        }
        if (width != null) {
            jsonObject.put("width", width);
        }
        if (autoColor != null) {
            jsonObject.put("auto_color", autoColor);
        }
        if (autoColor != null && !autoColor) {
            JSONObject colorJsonObject = new JSONObject();
            colorJsonObject.put("r", rColor == null ? 0 : rColor);
            colorJsonObject.put("g", gColor == null ? 0 : gColor);
            colorJsonObject.put("b", bColor == null ? 0 : bColor);
            jsonObject.put("line_color", colorJsonObject);
        }
        if (isHyaline != null) {
            jsonObject.put("is_hyaline", isHyaline);
        }
        HttpPost httpPost = HttpUtils.buildHttpPost(XcxConstants.GET_UNLIMITED_QRCODE.replace("{ACCESS_TOKEN}", accessToken), jsonObject.toJSONString(), MIMETypeEnum.JSON);
        return HttpUtils.send(HttpUtils.NONE_GET, httpPost, response -> {
            int status = response.getStatusLine().getStatusCode();
            if (status == HttpStatus.SC_OK) {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    Header header = entity.getContentType();
                    if (header.getValue().contains(ContentTypeEnum.JSON.getValue())) {
                        return null;
                    }
                    return IOUtils.getData(entity.getContent());
                }
                return null;
            } else if (status == HttpStatus.SC_MOVED_TEMPORARILY) {
                return null;
            } else {
                throw new ClientProtocolException("no normal status: " + status);
            }
        });
    }

    /**
     * 获取默认参数设置的小程序码
     * @param accessToken
     * @param page
     * @param scene
     * @return
     */
    public static byte[] getDefaultUnlimitedQrcode(String accessToken, String page, String scene) {
        return getUnlimitedQrcode(accessToken, page, scene, null, null, null, null, null, null);
    }

}
